package cn.wen.java.lang;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import cn.wen.java.nio.Charset;
import cn.wen.javax.servlet.UtilsOfServlet;
import cn.wen.javax.servlet.http.UtilsOfRequest;

/**
 * Title：与运行时系统相关的各种最常用的参数
 * <p>
 * Description：
 * <p>
 * Copyright：Copyright (c) 2010-2012
 * 
 * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
 * @version Revision：1.0 Date：2010/7/18 Description：初完成。
 *          <p>
 *          Revision：1.1 Date：2010/11/20 Description：修正：获取网站的物理根路径。
 *          <p>
 *          Revision：1.2 Date：2011/4/16 Description：按功能分类。
 *          <p>
 */
public final class HelperOfSystem {

    /**
     * 当前项目的根（路径）
     */
    public static final String USER_DIR = System.getProperty("user.dir");

    /**
     * JAVA运行时名称
     */
    public static final String JAVA_RUNTIME_NAME = System.getProperty("java.runtime.name");

    /**
     * JAVA运行时版本
     */
    public static final String JAVA_RUNTIME_VERSION = System.getProperty("java.runtime.version");

    /**
     * JAVA类路径
     */
    public static final String JAVA_CLASS_PATH = System.getProperty("java.class.path");

    /**
     * JAVA虚拟机名称
     */
    public static final String JAVA_VM_NAME = System.getProperty("java.vm.name");

    /**
     * JAVA虚拟机版本
     */
    public static final String JAVA_VM_VERSION = System.getProperty("java.vm.version");

    /**
     * JAVA虚拟机提供商
     */
    public static final String JAVA_VM_VENDOR = System.getProperty("java.vm.vendor");

    /**
     * 用户所属的城邦
     */
    public static final String USER_COUNTRY = System.getProperty("user.country");

    /**
     * 用户系统的语言
     */
    public static final String USER_LANGUAGE = System.getProperty("user.language");

    /**
     * 用户操作系统的架构
     */
    public static final String OS_ARCH = System.getProperty("os.arch");

    /**
     * 用户操作系统的名称
     */
    public static final String OS_NAME = System.getProperty("os.name");

    /**
     * 用户操作系统的版本
     */
    public static final String OS_VERSION = System.getProperty("os.version");

    /**
     * 当前项目的类路径的根
     */
    public static final String CLASS_PATH_ROOT;

    static {
	try {
	    CLASS_PATH_ROOT = getClassPath(System.class, "/");
	}
	catch (UnsupportedEncodingException e) {
	    throw new RuntimeException("获取类路径错误！不支持指定解码方式。", e);
	}
    }
    
    /**
     * <pre>
     * 获取指定类的路径。
     * 
     * Demo: <code>getClassPath(System.class);</code>
     * Also: <code>getClassPath(System.class, "");</code>
     * <pre>
     * 
     * @param clz 类
     * @return 类路径
     * @see #getClassPath(Class, String)
     */
    public static String getClassPath(Class<?> clz) throws UnsupportedEncodingException {
	return getClassPath(clz, "");
    }

    /**
     * <pre>
     * 获取指定类下的资源名的路径。
     * 
     * Demo: <code>getClassPath(System.class, "/");</code>
     * <pre>
     * 
     * @param clz 类
     * @param name 资源名
     * @return 类路径
     * @throws UnsupportedEncodingException URL decoding exception.
     */
    public static String getClassPath(Class<?> clz, String name) throws UnsupportedEncodingException {
	return URLDecoder.decode(clz.getResource(name).getPath(), Charset.UTF_8);
    }

    /**
     * Title：与运行时系统相关的各种最常用的参数
     * <p>
     * Description：与文件相关
     * <p>
     * Copyright：Copyright (c) 2011
     * 
     * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
     * @version Revision：1.0 Date：2011/4/16 Description：初完成。
     *          <p>
     */
    public static class File {

	/**
	 * 系统的路径分隔符
	 */
	public static final String PATH_SEPARATOR = System.getProperty("path.separator");

	/**
	 * 系统的文件夹分隔符
	 */
	public static final String FILE_SEPARATOR = System.getProperty("file.separator");

	/**
	 * 当前项目的文件编码格式
	 */
	public static final String FIlE_ENCODING = System.getProperty("file.encoding");

	/**
	 * 系统的文本换行符
	 */
	public static final String LINE_SEPARATOR = System.getProperty("line.separator");

    }

    /**
     * Title：与运行时系统相关的各种最常用的参数
     * <p>
     * Description：与Web相关，大部分功能需要在Web环境下使用。
     * <p>
     * Copyright：Copyright (c) 2011
     * 
     * @author <a href="mailto:ct_wen@qq.com">ctwen</a>, 温承瑭
     * @version Revision：1.0 Date：2011/4/16 Description：初完成。
     *          <p>
     *          Revision：1.1 Date：2011/4/16 Description：新增getApplicationRoot，因为APPLICATION_ROOT不一定所有项目适用。
     *          <p>
     */
    public static class Web {

	/**
	 * WEB 应用的根路径。
	 * <p>
	 * 如：E:\Developer\Java\IDE\Workspaces\MyEclipse 8.x\...\App\
	 * @see #getApplicationRoot(String)
	 */
	public static final String APPLICATION_ROOT = System.getProperty("webapp.root");

	/**
	 * <pre>
	 * WEB 应用的根路径。
	 * 如：getApplicationRoot("/temp");   ==   ...\App\temp
	 * 
	 * PS：该方法需要Struts2（优先）、Spring支持。
	 * </pre>
	 * 
	 * @param path 附加路径
	 * @return
	 */
	public static String getApplicationRoot(String path) {
	    return UtilsOfServlet.getServletContext().getRealPath(path);
	}

	/**
	 * <pre>
	 * WEB 应用的URL名称。
	 * 
	 * PS：该方法需要Struts2（优先）、Spring支持。
	 * </pre>
	 * 
	 * @return
	 */
	public static String getContextPath() {
	    return UtilsOfServlet.getServletContext().getContextPath();
	}
	
	/**
	 * 获取当前请求（HttpServletRequest）的完整URL地址。
	 * 
	 * @return 完整URL地址。
	 */
	public static String getFullPath() {
	    return UtilsOfRequest.getFullPath();
	}

	/**
	 * WEB 服务主目录。
	 */
	public static final String CATALINA_HOME = System.getProperty("catalina.home");

    }

}
